#include <stdio.h>

struct test
{
	int a;
	int b;
	int c;
	int d;
};

int _main()
{
	struct test * p;

	// p->a = 10;  error

	printf("%ld\n", sizeof(struct test)); 	// 16
	printf("%ld\n", sizeof(*p)); 	// 16
	printf("%ld\n", sizeof(p));	// 8

	return 0;
}


int array_sizeof(void)
{
	int zippo[4][2] = { {2,4}, {6, 8}, {1, 3}, {5, 7} };
	int (*pz)[2];
	int (*pzy)[3];
	int *pp[4];
	int *p;

	printf("(*p) = %d\n", sizeof((*p)));	// 4	int 型占4字节
	printf("(p) = %d\n", sizeof((p)));		// 8	64位，指针占8字节
	printf("(&p) = %d\n", sizeof((&p)));	// 8	64位，指针占8字节
	printf("(p) = %p\n", ((p)));			// 0x40086d

	printf("\n");

	printf("(zippo) = %d\n", sizeof((zippo)));				// 32	4*2*4=32
	printf("(zippo[]) = %d\n", sizeof((zippo[0])));			// 8	point
	printf("(zippo[][]) = %d\n", sizeof((zippo[0][0])));	// 4	int
	printf("(zippo) = %d\n", sizeof((&zippo)));				// 8	point
	printf("(zippo) = %d\n", sizeof((&zippo[0])));			// 8	point
	printf("(zippo) = %d\n", sizeof((&zippo[1])));			// 8	point

	printf("(pz) = %d\n", sizeof((pz)));		// 8	64位，指针占8字节
	printf("(pzy) = %d\n", sizeof((pzy)));		// 8	64位，指针占8字节
	printf("(pp) = %d\n", sizeof(pp));			// 32	4 * 8 = 32

	printf("(*pz) = %d\n", sizeof((*pz)));		// 8	2*int=8
	printf("(*pzy) = %d\n", sizeof((*pzy)));	// 12	3*int=8
	printf("(*pp) = %d\n", sizeof(*pp));		// 8	*pp[0] --> point

	printf("(*pz[]) = %d\n", sizeof((*pz[0])));	// 4	int
	printf("(*pzy[]) = %d\n", sizeof((*pzy[0])));// 4	int
	printf("(*pp[]) = %d\n", sizeof(*pp[0]));	// 4	int

	printf("(pz[]) = %d\n", sizeof((pz[0])));	// 8	2*int
	printf("(pzy[]) = %d\n", sizeof(pzy[0]));	// 12	3*int
	printf("(pp[]) = %d\n", sizeof(pp[0]));		// 8	point

	printf("(pz[]) = %d\n", sizeof((pz[0][0])));	// 4 int
	printf("(pzy[]) = %d\n", sizeof(pzy[0][0]));	// 4 int
	printf("(pp[]) = %d\n", sizeof(pp[0][0]));		// 4 int
	
	return 0;
}

int main()
{
	// _main();
	array_sizeof();

	return 0;
}
